package dao

import (
	"account/models"

	"gorm.io/gorm"
)

// 定义accountDao结构体，返回一个gorm类型的数据库连接
type AccountDao struct {
	db *gorm.DB
}

// 定义实例化accountDao的方法
func NewAccountDao(db *gorm.DB) *AccountDao {
	return &AccountDao{db: db}
}

// 定义添加账单记录的方法
func (ad *AccountDao) AddAccount(account *models.Account) error {
	result := ad.db.Create(&account)
	return result.Error
}

// 定义根据日期查看支出的方法
func (ad *AccountDao) GetOutCome(date string) (float64, error) {
	var sum float64
	var startDate = date + "-01-01"
	var endDate = date + "-12-31"
	row := ad.db.Table("accounts").
		Where("date BETWEEN ? AND ? AND category = ?", startDate, endDate, "支出").
		Select("COALESCE(SUM(amount), 0)"). // 将 NULL 转换为 0
		Row()
	// 扫描结果到 sum
	if err := row.Scan(&sum); err != nil {
		return 0, err
	}

	return sum, nil

}

// 定义根据日期查看收入的方法
func (ad *AccountDao) GetInCome(date string) (float64, error) {
	var startDate = date + "-01-01"
	var endDate = date + "-12-31"
	var sum float64
	row := ad.db.Table("accounts").
		Where("date BETWEEN ? AND ? AND category = ?", startDate, endDate, "收入").
		Select("COALESCE(SUM(amount), 0)"). // 将 NULL 转换为 0
		Row()
	// 扫描结果到 sum
	if err := row.Scan(&sum); err != nil {
		return 0, err
	}

	return sum, nil

}

// PaginateAccountsWithCondition 带条件的分页查询
// func (ad *AccountDao) PaginateAccountsWithCondition(page int, startDate,endDate, category string) ([]models.Account, int64, error) {
//     var accounts []models.Account
//     var total int64
//     // 计算 Offset
//     offset := (page - 1) * 10

//     // 构建查询条件
//     query := ad.db.Model(&models.Account{}).
//         Where("date BETWEEN ? AND ? AND category = ?", startDate, endDate, category)

//     // 查询总记录数（带条件）
//     if err := query.Count(&total).Error; err != nil {
//         return nil, 0, err
//     }

//     // 执行分页查询（带条件）
//     if err := query.Offset(offset).Limit(10).Find(&accounts).Error; err != nil {
//         return nil, 0, err
//     }

//     return accounts, total, nil
// }

// 分页查询所有记录
// func (ad *AccountDao)GetAllAccountWithLimit(page int)([]models.Account, int64, error) {
// 	var accounts []models.Account
//     var total int64
//     // 计算 Offset
//     offset := (page - 1) * 10

//     // 构建查询条件
//     query := ad.db.Model(&models.Account{})
// 	 // 查询总记录数（带条件）
// 	 if err := query.Count(&total).Error; err != nil {
//         return nil, 0, err
//     }

//     // 执行分页查询（带条件）
//     if err := query.Offset(offset).Limit(10).Find(&accounts).Error; err != nil {
//         return nil, 0, err
//     }

//     return accounts, total, nil
// }
// 终极分页查询
		func (ad *AccountDao) GetAccounts(page int, startDate, endDate, category string) ([]models.Account, int64, error) {
			var accounts []models.Account
			var total int64

			// 计算 Offset
			offset := (page - 1) * 10

			// 构建基础查询
			query := ad.db.Model(&models.Account{})

			// 添加条件（如果提供了条件）
			if category != "" {
				query = query.Where(" category = ?",  category)
			}
			// if startDate != "" && endDate != "" && category != "" {
			// 	query = query.Where("date BETWEEN ? AND ? AND category = ?", startDate, endDate, category)
			// }
			if startDate != "" && endDate != "" {
				query = query.Where("date BETWEEN ? AND ? ", startDate, endDate)
			}
			
			// 查询总记录数
			if err := query.Count(&total).Error; err != nil {
				return nil, 0, err
			}

			// 执行分页查询
			if err := query.Offset(offset).Limit(10).Find(&accounts).Error; err != nil {
				return nil, 0, err
			}

			return accounts, total, nil
		}